export const AnsiProps = {
    // 重置
    reset: '0',
    // 粗体
    bold: '1',
    // 斜体
    italic: '2',
    // 下划线
    underline: '3',
    // 黑色
    black: '30',
    // 红色
    red: '31',
    // 绿色
    green: '32',
    // 黄色
    yellow: '33',
    // 蓝色
    blue: '34',
    // 紫色
    magenta: '35',
    // 青色
    cyan: '36',
    // 白色
    white: '37',
    // 背景黑色
    bgBlack: '40',
    // 背景红色
    bgRed: '41',
    // 背景绿色
    bgGreen: '42',
    // 背景黄色
    bgYellow: '43',
    // 背景蓝色
    bgBlue: '44',
    // 背景紫色
    bgMagenta: '45',
    // 背景青色
    bgCyan: '46',
    // 背景白色
    bgWhite: '47',
}

type AnsiPropsType = keyof typeof AnsiProps;

function dataToText(data: any) {
    if (typeof data === 'object') {
        return data.toString()
    }
    return data
}

class AnsiText {
    data: any[] = []
    separatorText: string = ' '
    props: string[] = []

    static text(...data: any[]) {
        return new AnsiText(data)
    }

    constructor(...data: any[]) {
        if (!data || data.length === 0) {
            return
        }
        this.data = data
    }

    /**
     * 多文本间隔符
     * @param {string} separator 间隔符
     */
    separator(separator: string) {
        this.separatorText = separator
        return this
    }

    getText() {
        if (!this.data || this.data.length === 0) return undefined
        return this.data.map(item => dataToText(item)).join(this.separatorText)
    }

    set(...props: AnsiPropsType[]) {
        if (!props || props.length === 0) return this
        for (let prop of props) {
            const propVal = AnsiProps[prop]
            if (this.props.hasOwnProperty(propVal)) {
                return this
            }
            this.props.push(propVal)
        }
        return this
    }

    out() {
        return `\x1b[${this.props.join(';')}m${this.getText()}\x1b[${AnsiProps['reset']}m`
    }
}

export default AnsiText
